#include <schedule.h>
#include <8259A.h>
#include <task.h>
#include <desc.h>
#include <share.h>
#include <list.h>

/******************************************************************************
* 函数名称: void schedule(void)
* 功能说明: 进程调度
* 输入参数: 无
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void schedule(void)
{
    if(!ListIsEmpty(&TASK_LIST))
    {
        // 取出任务链表 TASK_LIST 的末尾节点
        LIST_NODE* pListNode = TASK_LIST.prev;
        TASK_LIST_NODE* nodeTmp = (TASK_LIST_NODE *)LIST_NODE(pListNode,  TASK_LIST_NODE, listNode);
        current_task = nodeTmp->task;

        // 删除 TASK_LIST 链表的末尾节点
        ListDelNode(TASK_LIST.prev);

        // 在 TASK_LIST 链表头插入节点
        ListAddHead(&TASK_LIST, pListNode);

        TSS* tss = (TSS*)(*(U32*)TSS_ENTRY_ADDR);                           // 找到 TSS
        tss->esp0 = (U32)(&(current_task->reg)) + sizeof(current_task->reg);    // TSS.esp0 指向任务上下文数据结构 reg 的末尾
        current_reg = (U32)(&current_task->reg);                                // current_reg 指向任务上下文数据结构 reg 的起始位置
    }
}

/******************************************************************************
* 函数名称: void Int0x20Handle(void)
* 功能说明: 0x20 号中断中断服务程序的逻辑功能部分
* 输入参数: 无
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void Int0x20Handle(void)
{
    static U32 count = 0;

    if(count++ % 5 == 4)
    {
        schedule();
    }
    write_m_EOI();  
}

